<?php
/**
Interface DAO de Rateio. Estes m�todos N�O devem ser chamados diretamente.
Ao inv�s disso devem ser chamados por m�todos da classe Rateio.
*/
require_once('DataAccess.php');
require_once('Rateio.php');

class RateioDAO
{
      private $database;

      public function __construct( )
      {
               $this->database = DataAccess::getConnection();
      }
      
      public function CadastrarRateio( $rateio )
      {
      	$consulta = $this->database->Fetch("BEGIN");
      	$campus = $rateio->campus;
      	$fonte  = $rateio->fonte;
      	
      	if( $consulta )
      	{
      	  $consulta = $this->database->Fetch("INSERT into t_rateio(t_campus_id, t_fonte_id, tipo_despesa, valor_corrente, valor_total)
      	  									VALUES('$campus->id','$fonte->id','$rateio->tipoDespesa', '$rateio->valorCorrente', '$rateio->valorTotal')");
      	  
      	  if( $consulta )
      	  {
      	  	$this->database->Fetch("COMMIT");
      	  	return TRUE;
      	  }
      	  else
      	  {
      	  	$this->database->Fetch("ROLLBACK");
      	  	return FALSE;
      	  }
      	}
      	else
      	{
      		$this->database->Fetch("ROLLBACK");
        	return FALSE;
      	}
      	
      }
      
      public function AlterarRateio( $rateio )
      {
        $consulta = $this->database->Fetch("BEGIN");
      	$campus = $rateio->campus;
      	$fonte  = $rateio->fonte;
              	
      	if( $consulta )
      	{
      	  $consulta = $this->database->Fetch("UPDATE t_rateio SET t_campus_id='$campus->id',
      	  t_fonte_id=' $fonte->id',tipo_despesa='$rateio->tipoDespesa',valor_corrente='$rateio->valorCorrente',valor_total='$rateio->valorTotal'
      	  where id = '$rateio->id' ");
      	  									
      	  
      	  if( $consulta )
      	  {
      	  	$this->database->Fetch("COMMIT");
      	  	return TRUE;
      	  }
      	  else
      	  {
      	  	$this->database->Fetch("ROLLBACK");
      	  	return FALSE;
      	  }
      	}
      	else
      	{
      		$this->database->Fetch("ROLLBACK");
        	return FALSE;
      	}      	
      	
      }
      
      public function ExcluirRateio( $rateioId )
      {
      		$consulta = $this->database->Fetch("BEGIN");
		
			if ( $consulta )
    		{       
      			$resultado = $this->database->Fetch(" DELETE FROM t_rateio WHERE id = $rateioId ");
               
    			if( $consulta )
            	{
            		$consulta = $this->database->Fetch("COMMIT");
            		return TRUE;
           		}
           		else
           		{
        			$consulta = $this->database->Fetch("ROLLBACK");
           			return FALSE;
           		}
    		}
    		else
    		{
    			$consulta = $this->database->Fetch("ROLLBACK");
            	return FALSE;
    		}
      }
      /**
      Busca na tabela t_rateio todas as fontes v�nculadas ao programa de chave-prim�ria $programaId.
      Para cada registro encontrado ser� criada uma inst�ncia de Fonte com todos os valores das colunas do registro retornado.
      Por fim, este m�todo retornar� um array de objetos Fonte para os registros encontrados no banco de dados.
      @programaId - Identificador no banco de dados do programa que cont�m as fontes.
      @return - Retorna um array de objetos do tipo Fonte. Caso n�o encontre nenhum registro retorna FALSE.
     */
      public function LoadFontes( $programaId )
      {
             $consulta = $this->database->Fetch(" SELECT * FROM t_fonte WHERE T_PROGRAMA_ID = '".$programaId."'");
             if( $consulta != FALSE )
             {
                  $rows = $this->database->getRow();
                  $objetos = array();

                  for( $i = 0; $i < count($rows); $i++ )
                  {
                       $fonte = new Fonte();
                       $fonte->id = $rows[$i]['id'];
                       $programa = new Programa();
                       $programaVinculado = $programa->CarregarPrograma( $rows[$i]['t_programa_id'] );
                       $fonte->programa = $programaVinculado;
                       $fonte->tipoDespesa = $rows[$i]['tipo_despesa'];
                       $fonte->fonteRecurso = $rows[$i]['fonte_recurso'];
                       $fonte->valor = $rows[$i]['valor'];

                       $objetos[] = $fonte;
                  }

                  return $objetos;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                 return FALSE;
             }
      }
      /**
      Busca na tabela t_rateio pelo registro de chave-prim�ria $id.
      @id - Chave-prim�ria do rateio cadastrada no banco de dados.
      @return - Retorna um objeto do tipo Rateio com todos os valores das colunas associadas ao registro. Caso n�o encontre nenhum registro retorna FALSE.
      */
      public function LoadRateio( $id )
      {
             $consulta = $this->database->Fetch(" SELECT * FROM t_rateio WHERE ID = '".$id."'");
             if( $consulta != FALSE )
             {
                 $rows = $this->database->getRow();
                 $rateio = new Rateio();
                 $rateio->id = $rows[0]['id'];
                 $campus = new Campus();
                 $campusVinculado = $campus->CarregarCampus( $rows[0]['t_campus_id'] );
                 $rateio->campus = $campusVinculado;
                 $fonte = new Fonte();
                 $fonteVinculada = $fonte->CarregarFonte( $rows[0]['t_fonte_id'] );
                 $rateio->fonte = $fonteVinculada;                 
                 $rateio->tipoDespesa = $rows[0]['tipo_despesa'];
                 $rateio->valorCorrente = $rows[0]['valor_corrente'];
                 $rateio->valorTotal = $rows[0]['valor_total'];
                 
                 return $rateio;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                 return FALSE;
             }
      }
      
      /**
      Busca no banco de dados pelo n�mero da fonte de chave-prim�ria $fonteId
      @fonteId - Chave-prim�ria da fonte cadastrada no banco
      @return - Retorna uma string com o nome da fonte. Caso n�o encontre nenhum resultado, retorna FALSE
      */
      public function LoadRecurso( $fonteId )
      {
               $consulta = $this->database->Fetch("SELECT f.fonte_recurso as fonte
                                                   FROM t_compra c, t_fonte f
                                                   WHERE c.t_fonte_id = ".$fonteId."
                                                   AND f.id = c.t_fonte_id");
               if( $consulta != FALSE )
               {
                   $rows = $this->database->getRow();

                   $fonte = $rows[0]['fonte'];

                   return $fonte;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                   return FALSE;
             }
      }
      /**
      Calcula no banco de dados o Saldo de uma Fonte pela chave-prim�ria $fonteId
      @fonteId - Chave-prim�ria da fonte cadastrada no banco
      @return - Retorna uma string com o saldo da fonte. Caso n�o encontre nenhum resultado, retorna FALSE
      */
      public function LoadSaldo( $fonteId )
      {
               $consulta = $this->database->Fetch("SELECT f.valor, (
												f.valor - COALESCE( SUM( r.valor_total ) , 0 )
												) AS saldo_fonte
												FROM t_fonte f
												LEFT JOIN t_rateio r ON r.t_fonte_id = f.id
												WHERE f.id = $fonteId
												group by f.id");
               if( $consulta != FALSE )
               {
                   $rows = $this->database->getRow();

                   $rateio = $rows[0]['saldo_fonte'];

                   return $rateio;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                   return FALSE;
             }
      }
      
      /**
      Calcula no banco de dados o Saldo de uma Fonte pela chave-prim�ria $fonteId e $campusId
      @fonteId - Chave-prim�ria da fonte cadastrada no banco
      @return - Retorna uma string com o saldo da fonte. Caso n�o encontre nenhum resultado, retorna FALSE
      */
      public function LoadSaldoPorCampus( $fonteId , $campusId)
      {
               $consulta = $this->database->Fetch("SELECT (r.valor_total - COALESCE(  re.valor  , 0 )) AS saldo_rateio
												FROM t_rateio r
												LEFT JOIN t_reserva re ON r.id = re.t_rateio_id
												WHERE r.t_fonte_id = $fonteId AND r.t_campus_id= $campusId");
               if( $consulta != FALSE )
               {
                   $rows = $this->database->getRow();

                   $rateio = $rows[0]['saldo_rateio'];

                   return $rateio;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                   return FALSE;
             }
      }
      
      /**
      Busca na tabela t_rateio todos os rateios v�nculados a uma fonte de recurso com a chave-prim�ria $fonteId.
      Para cada registro encontrado ser� criada uma inst�ncia de Rateio com todos os valores das colunas do registro retornado.
      Por fim, este m�todo retornar� um array de objetos Rateio para os registros encontrados no banco de dados.
      @fonteId - Identificador no banco de dados da fonte de recurso que cont�m os rateios.
      @return - Retorna um array de objetos do tipo Fonte. Caso n�o encontre nenhum registro retorna FALSE.
     */      
      public function LoadRateiosPorFonte( $fonteId )
      {
             $consulta = $this->database->Fetch(" SELECT * FROM t_rateio WHERE T_FONTE_ID = '".$fonteId."'");
             if( $consulta != FALSE )
             {
                  $rows = $this->database->getRow();
                  $objetos = array();

                  for( $i = 0; $i < count($rows); $i++ )
                  {
                       $rateio = new Rateio();
                       $rateio->id = $rows[$i]['id'];
                       $campus = new Campus();
                       $campusVinculado = $campus->CarregarCampus( $rows[$i]['t_campus_id'] );
                       $rateio->campus = $campusVinculado;
                       $fonte = new Fonte();
                       $fonteVinculada = $fonte->CarregarFonte($rows[$i]['t_fonte_id']);
                       $rateio->fonte = $fonteVinculada;
                       $rateio->tipoDespesa = $rows[$i]['tipo_despesa'];
                       $rateio->valorCorrente = $rows[$i]['valor_corrente'];
                       $rateio->valorTotal = $rows[$i]['valor_total'];                       
                       
                       $objetos[] = $rateio;
                  }

                  return $objetos;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                 return FALSE;
             }
      }
      
      public function LoadRateiosPorPrograma( $programaId , $tipoDespesa )
      {
      		$sql = "";
			 if($tipoDespesa != "T"){
			 	$sql = " AND r.tipo_despesa = ".$tipoDespesa;
			 }else{
			 	$sql =" AND r.id > 1";
			 }      	
             $consulta = $this->database->Fetch(" SELECT r . * , f.t_programa_id FROM t_rateio r, t_fonte f
												WHERE r.t_fonte_id = f.id
												AND f.t_programa_id = ".$programaId." ".$sql." order by r.t_fonte_id,r.t_campus_id,r.valor_total");
             if( $consulta != FALSE )
             {
                  $rows = $this->database->getRow();
                  $objetos = array();

                  for( $i = 0; $i < count($rows); $i++ )
                  {
                       $rateio = new Rateio();
                       $rateio->id = $rows[$i]['id'];
                       $campus = new Campus();
                       $campusVinculado = $campus->CarregarCampus( $rows[$i]['t_campus_id'] );
                       $rateio->campus = $campusVinculado;
                       $fonte = new Fonte();
                       $fonteVinculada = $fonte->CarregarFonte($rows[$i]['t_fonte_id']);
                       $rateio->fonte = $fonteVinculada;
                       $rateio->tipoDespesa = $rows[$i]['tipo_despesa'];
                       $rateio->valorCorrente = $rows[$i]['valor_corrente'];
                       $rateio->valorTotal = $rows[$i]['valor_total'];
                       
                       $objetos[] = $rateio;
                  }

                  return $objetos;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                 return FALSE;
             }
      }
      
      public function CarregarRateioPorCampus( $fonteId, $campusId )
      {
             $consulta = $this->database->Fetch(" SELECT * FROM t_rateio WHERE T_FONTE_ID = '".$fonteId."' AND T_CAMPUS_ID = '".$campusId."'");
             if( $consulta != FALSE && mysql_num_rows($consulta) > 0)
             {
                 $rows = $this->database->getRow();
                 $rateio = new Rateio();
                 $rateio->id = $rows[0]['id'];
                 $campus = new Campus();
                 $campusVinculado = $campus->CarregarCampus( $rows[0]['t_campus_id'] );
                 $rateio->campus = $campusVinculado;
                 $fonte = new Fonte();
                 $fonteVinculada = $fonte->CarregarFonte( $rows[0]['t_fonte_id'] );
                 $rateio->fonte = $fonteVinculada;                 
                 $rateio->tipoDespesa = $rows[0]['tipo_despesa'];
                 $rateio->valorCorrente = $rows[0]['valor_corrente'];
                 $rateio->valorTotal = $rows[0]['valor_total'];
                 
                 return $rateio;
             }
             else if( mysql_num_rows( $consulta ) == 0 )
             {
                 return FALSE;
             }
      }
      
      public function debitarValorCorrente($valor, $id){
      	$consulta = $this->database->Fetch("BEGIN");
            	
      	if( $consulta )
      	{
      	  $consulta = $this->database->Fetch("update t_rateio set valor_corrente = (valor_corrente - $valor) where id = $id");
      	  									
      	  
      	  if( $consulta )
      	  {
      	  	$this->database->Fetch("COMMIT");
      	  	return TRUE;
      	  }
      	  else
      	  {
      	  	$this->database->Fetch("ROLLBACK");
      	  	return FALSE;
      	  }
      	}
      	else
      	{
      		$this->database->Fetch("ROLLBACK");
        	return FALSE;
      	}      	
      }
      
      public function creditarValorCorrente($valor, $id){
      	$consulta = $this->database->Fetch("BEGIN");
      	 
      	if( $consulta )
      	{
      		$consulta = $this->database->Fetch("update t_rateio set valor_corrente = (valor_corrente + $valor) where id = $id");

      		 
      		if( $consulta )
      		{
      			$this->database->Fetch("COMMIT");
      			return TRUE;
      		}
      		else
      		{
      			$this->database->Fetch("ROLLBACK");
      			return FALSE;
      		}
      	}
      	else
      	{
      		$this->database->Fetch("ROLLBACK");
      		return FALSE;
      	}
      }
}


?>
